/*
 * Accion.cpp
 *
 *  Created on: 01/07/2011
 *      Author: facundo
 */

#include "Accion.h"

#include <stdio.h>
#include <string.h>
#include "log/lockinglog.h"
#include <sstream>

using namespace std;



Accion::Accion(Mi_Tipo_Mensaje men,int debug){
	this->mensaje=men;
	this->log = new lockinglog (debug,(char *) "logserver.txt");
}


int Accion::Actuar(Salas* salas){

	// Esto se debe implementar con "defines", ya que es muy probable que los numeros cambien...
	/*Tipos de Mensaje
	 * 1 Crear Sala nueva
	 * 2 Eliminar Sala
	 * 3 Unirse A Sala
	 * 4 Salir de Sala
	 * 5 Mandar Mensaje a Sala
	 * */
	stringstream log1;
switch(this->mensaje.tipomensaje){

case TIPO_MENSAJE_SALA_NUEVA:
	//cout<<"llega mensaje de sala nueva: Numero: "<<this->mensaje.num<<" Nombre: "<<this->mensaje.mensaje<<endl;
	log1<<"Llega mensaje de sala nueva: Numero: "<<this->mensaje.num<<" Nombre: "<<this->mensaje.mensaje<<endl;
	this->log->loguear((char*) log1.str().c_str());

	if (!(salas->agregarSala(this->mensaje.num,this->mensaje.mensaje))){
		this->mensaje.tipomensaje=TIPO_MENSAJE_SALA_YA_EXISTE;
		cout<<"sala no creada"<<endl;
		log1<<"sala no creada"<<endl;
		this->log->loguear((char*) log1.str().c_str());
	}
	break;

case TIPO_MENSAJE_SALA_QUITAR:
	log1<<"Llega mensaje de quitar sala Numero: "<<this->mensaje.num<<endl;
	this->log->loguear((char*) log1.str().c_str());
	salas->quitarSala(this->mensaje.num);
	break;

case TIPO_MENSAJE_LOGIN:
	log1<<"Llega mensaje de Nuevo cliente pid:"<<this->mensaje.pidEmisor<<endl;
	this->log->loguear((char*) log1.str().c_str());
	salas->agregarClienteaSala(SALA_INICIAL,this->mensaje.pidEmisor,this->mensaje.mensaje);
	break;

case TIPO_MENSAJE_UNIRSE_A_SALA:
	log1<<"Llega mensaje de Agregar cliente "<<this->mensaje.pidEmisor<<" a la sala "<<this->mensaje.num<<endl;
	this->log->loguear((char*) log1.str().c_str());
	if (salas->verificarSala(this->mensaje.num)){
		salas->moverClientedeSala(SALA_INICIAL,this->mensaje.num,this->mensaje.pidEmisor);
		cout<<"Agrega cliente a Sala"<<this->mensaje.num<<endl;
		log1<<"Agrega cliente a Sala"<<this->mensaje.num<<endl;
		this->log->loguear((char*) log1.str().c_str());
		this->mensaje.tipomensaje=TIPO_MENSAJE_UNIRSE_A_SALA_ACEPTAR;
	}
	else
	{
		this->mensaje.tipomensaje=TIPO_MENSAJE_SALA_NO_ENCONTRADA;
		log1<<"Sala No Encontrada"<<endl;
		this->log->loguear((char*) log1.str().c_str());
		cout<<"Sala no Encontrada"<<endl;
	}

	break;

case TIPO_MENSAJE_SALIR_DE_SALA:
	log1<<"Llega mensaje de Quitar cliente "<<this->mensaje.pidEmisor<<" de la sala "<<this->mensaje.num<<endl;
	this->log->loguear((char*) log1.str().c_str());
	salas->quitarClientedeSala(this->mensaje.num,this->mensaje.pidEmisor);

//	salas->agregarClienteaSala(SALA_INICIAL,this->mensaje.pidEmisor);
	break;

case TIPO_MENSAJE_ENVIAR_MENSAJE:
	log1<<"Llega mensaje de cliente "<<this->mensaje.pidEmisor<<" a su sala Mensaje:"<<this->mensaje.mensaje<<endl;
	this->log->loguear((char*) log1.str().c_str());

	this->mensaje.mtype=RESPUESTA;
	salas->mandarMensajeaSala(this->mensaje.pidEmisor,this->mensaje);
	return 0;
	break;

case TIPO_MENSAJE_LOGOFF:

	salas->quitarCliente(this->mensaje.pidEmisor);
	cout<<"Cliente Eliminado pid:"<<this->mensaje.pidEmisor<<endl;
	log1<<"Cliente Eliminado pid:"<<this->mensaje.pidEmisor<<endl;
	this->log->loguear((char*) log1.str().c_str());

	break;

case TIPO_MENSAJE_LISTAR_SALAS:
	log1<<"Llega Mensaje de Listar Salas de pid:"<<this->mensaje.pidEmisor<<endl;
	this->log->loguear((char*) log1.str().c_str());
	strcpy(this->mensaje.mensaje,salas->listar().c_str());
	break;

case TIPO_MENSAJE_LISTAR_USUARIOS:
	log1<<"Llega Mensaje de Listar Clientes de su Sala de pid:"<<this->mensaje.pidEmisor<<endl;
		this->log->loguear((char*) log1.str().c_str());
	strcpy(this->mensaje.mensaje,salas->listarUsuarios(this->mensaje.pidEmisor).c_str());
		//cout<<"Clientes en sala:"<<endl<<salas->listarUsuarios(this->mensaje.pidEmisor)<<endl;
	break;
case TIPO_MENSAJE_SALIR:
		return -1;
		break;
case TIPO_MENSAJE_HISTORIA:
	log1<<"Llega Mensaje de Mandar Historia de su Sala de pid:"<<this->mensaje.pidEmisor<<endl;
	this->log->loguear((char*) log1.str().c_str());
	salas->mandarHistorialdeMensajes(this->mensaje.pidEmisor);
	return 0;
	break;
default:
	log1<<"Llega Mensaje Desconocido de pid:"<<this->mensaje.pidEmisor<<endl;
	this->log->loguear((char*) log1.str().c_str());
	cerr<<"Servidor: recibi un mensaje desconocido"<<endl;
	return 1;
}
swap(this->mensaje.pidEmisor, this->mensaje.pidReceptor);
this->mensaje.recibido = true;
mensaje.mtype=RESPUESTA;
//cout<<"Mando mensaje al pid "<<this->mensaje.pidReceptor<<" Tipo de mensaje:"<<this->mensaje.tipomensaje<<endl;

salas->mandarMensajeaCliente(this->mensaje.pidReceptor, this->mensaje);

return 0;
}
Accion::~Accion() {
	// TODO Auto-generated destructor stub
}
